import pandas as pd
import os
from datetime import datetime


def parse_excel_schedule(file_path):
    """
    解析Excel文件前两行的日期和排班数据，生成指定格式的结果字符串。

    参数:
        file_path (str): Excel文件路径

    返回:
        str: 格式化后的排班结果，如"[0506-0509]A[0510]B+..."
    """
    # 读取Excel文件
    df = pd.read_excel(file_path, header=None)

    # 收集有日期和排班的有效单元格对
    date_shift_pairs = []
    for col in range(df.shape[1]):
        date_cell = df.iloc[0, col]  # 第一行（日期行）
        shift_cell = df.iloc[1, col]  # 第二行（排班行）

        # 仅处理日期和排班均非空的单元格
        if pd.notna(date_cell) and pd.notna(shift_cell):
            # 日期格式处理：替换"/"为""，得到mmdd格式
            date_str = str(date_cell).replace("/", "")
            # 排班格式处理：去除首尾空格
            shift_str = str(shift_cell).strip()
            date_shift_pairs.append((date_str, shift_str))

    # 解析连续的排班区间
    result_blocks = []
    if not date_shift_pairs:
        return ""  # 无有效数据时返回空字符串

    current_shift = date_shift_pairs[0][1]  # 当前排班类型
    start_date = date_shift_pairs[0][0]  # 当前区间起始日期
    start_index = 0  # 当前区间起始索引

    for i in range(1, len(date_shift_pairs)):
        current_date, current_shift_cell = date_shift_pairs[i]

        if current_shift_cell == current_shift:
            continue  # 排班未变化，继续当前区间
        else:
            # 排班变化，结束当前区间
            end_date = date_shift_pairs[i - 1][0]

            # 根据区间长度选择格式
            if i - start_index == 1:  # 单日区间
                result_blocks.append(f"[{start_date}]{current_shift}")
            else:  # 多日区间
                result_blocks.append(f"[{start_date}-{end_date}]{current_shift}")

            # 开始新的排班区间
            current_shift = current_shift_cell
            start_date = current_date
            start_index = i

    # 处理最后一个区间
    end_date = date_shift_pairs[-1][0]
    if len(date_shift_pairs) - start_index == 1:  # 单日区间
        result_blocks.append(f"[{start_date}]{current_shift}")
    else:  # 多日区间
        result_blocks.append(f"[{start_date}-{end_date}]{current_shift}")

    # 直接拼接所有区间块
    return ''.join(result_blocks)


def find_excel_files():
    """查找同级目录下的Excel文件"""
    excel_files = []
    for file in os.listdir('.'):
        if file.endswith(('.xlsx', '.xls')):
            excel_files.append(file)
    return excel_files


def main():
    """主函数"""
    # 查找同级目录下的Excel文件
    excel_files = find_excel_files()

    if not excel_files:
        print("未找到Excel文件，请确保目录下有.xlsx或.xls文件")
        return

    print("找到以下Excel文件:")
    for i, file in enumerate(excel_files, 1):
        print(f"{i}. {file}")

    # 如果有多个文件，让用户选择
    if len(excel_files) > 1:
        try:
            choice = int(input("请选择要解析的文件编号: ")) - 1
            if 0 <= choice < len(excel_files):
                selected_file = excel_files[choice]
            else:
                print("无效选择，使用第一个文件")
                selected_file = excel_files[0]
        except ValueError:
            print("无效输入，使用第一个文件")
            selected_file = excel_files[0]
    else:
        selected_file = excel_files[0]

    print(f"\n正在解析文件: {selected_file}")

    try:
        result = parse_excel_schedule(selected_file)
        print("\n解析结果:")
        print(result)

        # 保存结果到文本文件
        output_file = f"排班结果_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt"
        with open(output_file, 'w', encoding='utf-8') as f:
            f.write(result)
        print(f"\n结果已保存到: {output_file}")

    except Exception as e:
        print(f"解析过程中发生错误: {e}")


if __name__ == "__main__":
    main()
